﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FuncAction
{
    public class Program
    {
        static void Main(string[] args)
        {
            //1、两种委托的常见形式和区别
            //（1）、Func委托有5个重载形式,区别仅在于它所指向的方法的签名的参数个数，分别如下：
            //        Func<TResult>
            //        Func<T, TResult>
            //        Func<T1, T2, TResult>
            //        unc<T1, T2, T3, TResult>
            //        Func<T1, T2, T3, T4, TResult>
            //        其中T, T1,..T4是委托指向的方法的参数的类型，TResult为方法的返回类型。
            //（2）、Action委托也有5个重载形式，分别如下：
            //        Action
            //        Action<T>
            //        Action<T1, T2>
            //        Action<T1, T2, T3>
            //        Action<T1, T2, T3, T4>
            //        其中T, T1,..T4是委托指向的方法的参数的类型。
            //总结：Func和Action委托的唯一区别在于Func要有返回值， Action没有返回值。

            int num = 5;

            FirstCalcSquare calFirst = Square;
            Console.WriteLine("The square of {0} is {1}",num ,calFirst(num));

            Func<int, int> funcTest = Program.Square;
            Console.WriteLine("The square of {0} is {1}", num, funcTest(num));

            SecondCalcSquare calSecond = GetSquere;
            calSecond(num);

            Action<int> actionTest = Program.GetSquere;
            actionTest(num);

            Console.ReadLine();


        }

        private delegate int FirstCalcSquare(int input);

        private static int Square(int input)
        {
            return input * input;
        }

        private delegate void SecondCalcSquare(int input);

        private static void GetSquere(int input)
        {
            Console.WriteLine("The square of {0} is {1}", input, input+input);
        }
    }
}
